package io.ewolf.ssm.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import io.ewolf.ssm.po.ItemCustom;
import io.ewolf.ssm.po.ItemQueryVo;
import io.ewolf.ssm.service.ItemService;
import io.ewolf.ssm.validation.ValidGroup1;

/**
 * controller方法的形参可直接使用HttpServletRequest,HttpServletResponse,HttpSession,Model(ModelMap).
 * 
 * @author ewolf
 *
 */
@Controller
// 限制http请求方法
@RequestMapping(value = "/item", method = { RequestMethod.GET, RequestMethod.POST })
public class ItemController {

	@Autowired
	private ItemService itemService;

	private static final Log logger = LogFactory.getLog(ItemController.class);
	
	
	//商品分类。
	// @ModelAttribute("itemType"):表示最终将方法的返回值放在request域，key为itemType。
	@ModelAttribute("itemType")
	public Map<String, String> getItemType () {
		Map<String, String> itemType = new HashMap<String, String>();
		itemType.put("1", "旺仔小馒头");
		itemType.put("2", "大面包");
		return itemType;
	} 
	
	

	// 商品的查询
	// 包装类型ItemQueryVo的参数绑定：页面“<input name="itemCustom.itemname">”中的itemCustom和包装类的属性名要一致
	@RequestMapping(value = "/queryItem")
	public ModelAndView queryItem(ItemQueryVo itemQueryVo) throws Exception {
		logger.info("queryItem() 被调用。。。。。。");
		// 可以直接传null,就是没有查询条件
		List<ItemCustom> itemList = itemService.findItemList(itemQueryVo);
		ModelAndView mv = new ModelAndView();
		mv.addObject("itemList", itemList);
		mv.setViewName("item/itemList");
		return mv;
	}

	// 商品信息修改页面显示
	// 如果不使用@RequestParam，要求request传入参数的名称和方法的形参名称一致。required=true属性指定参数必须传入。
	@RequestMapping(value = "/editItem")
	public String editItem(Model model, @RequestParam(value = "id", required = true) Integer id) throws Exception {
		logger.info("editItem() 被调用。。。。。。");

		// 调用service，根据id查询商品信息
		ItemCustom itemCustom = itemService.findItemById(id);

		// ModelAndView mv = new ModelAndView();
		// mv.addObject("itemCustom", itemCustom);
		// mv.setViewName("item/editItem");
		// return mv;

		model.addAttribute("item", itemCustom);

		return "item/editItem";
	}

	// 商品信息修改提交。
	// pojo的绑定：页面中input的name和controller的pojo形参中的属性名称要一致才能绑定成功。
	//在需要校验的pojo前面添加@Validated，在需要校验的pojo后面添加BindingResult bindingResult接收校验出错信息。
	//@Validated和BindingResult bindingResult是配对出现的并且顺序是固定的（一前一后）.
	// value={ValidGroup1.class}指定使用ValidGroup1分组的校验。
	// @ModelAttribute("item"):指定pojo回显到页面在request域中的key。
	@RequestMapping(value = "/editItemSubmit")
	public String editItemSubmit(Model model, Integer id, 
			@ModelAttribute("item") @Validated(value={ValidGroup1.class}) ItemCustom itemCustom, BindingResult bindingResult) throws Exception {
		logger.info("editItemSubmit() 被调用。。。。。。");
		//获取校验信息
		if(bindingResult.hasErrors()) {
			//输出错误信息
			List<ObjectError> allErrors = bindingResult.getAllErrors();
			for(ObjectError objectError:allErrors) {
				//输出错误信息
				System.out.println(objectError.getDefaultMessage());
			}
			//将错误信息传到页面
			model.addAttribute("allErrors", allErrors);
			
			//最简单的方法回显，使用model，可以不用@ModelAttribute
			model.addAttribute("item", itemCustom);
			
			return "item/editItem";
		}
		itemService.updateItem(id, itemCustom);
		return "success";
	}

	// 批量删除商品信息
	@RequestMapping("/deleteItem")
	public String deleteItem(ItemQueryVo itemQueryVo) throws Exception {
		// 在包装类ItemQueryVo中添加Integer[]属性，接收批量提交要删除的商品id
		itemService.deleteItemByArray(itemQueryVo);
		return "success";
	}

	// 批量修改商品页面，将商品信息查询出来，在页面中可以编辑商品信息。
	@RequestMapping(value = "/editItemQuery")
	public ModelAndView editItemQuery(ItemQueryVo itemQueryVo) throws Exception {
		// 可以直接传null,就是没有查询条件
		List<ItemCustom> itemList = itemService.findItemList(itemQueryVo);
		ModelAndView mv = new ModelAndView();
		mv.addObject("itemList", itemList);
		mv.setViewName("item/editItemQuery");
		return mv;
	}

	// 批量修改商品信息(通过包装类的List<ItemCustom>属性)
	@RequestMapping(value = "/editItemAllSubmit")
	public String editItemAllSubmit(ItemQueryVo itemQueryVo) throws Exception {
		// 在包装类ItemQueryVo中添加List<ItemCustom>属性，接收批量提交的信息
		itemService.updateByList(itemQueryVo);
		return "success";
	}

}
